/*
 * $Id: fio.c,v 1.23 2006-06-30 04:18:47 bacon Exp $
 */

#include <xp/bas/fio.h>
#include <xp/bas/sysapi.h>
#include <xp/bas/memory.h>
#include <xp/bas/assert.h>

xp_fio_t* xp_fio_open (xp_fio_t* fio, 
	const xp_char_t* path, int flags, xp_mode_t mode)
{
	if (fio == XP_NULL) 
	{
		fio = (xp_fio_t*) xp_malloc (xp_sizeof(xp_fio_t));
		if (fio == XP_NULL) return XP_NULL;
		fio->__dynamic = xp_true;
	}
	else fio->__dynamic = xp_false;

	fio->handle = xp_open (path, flags, mode);
	if (fio->handle == XP_HND_INVALID) 
	{
		if (fio->__dynamic) xp_free (fio);
		return XP_NULL;
	}

	return fio;
}

xp_fio_t* xp_fio_openhnd (xp_fio_t* fio, xp_fiohnd_t handle)
{
	if (fio == XP_NULL) 
	{
		fio = (xp_fio_t*) xp_malloc (xp_sizeof(xp_fio_t));
		if (fio == XP_NULL) return XP_NULL;
		fio->__dynamic = xp_true;
	}
	else fio->__dynamic = xp_false;

	fio->handle = handle;
#ifdef _WIN32
	fio->flags = 0;
#endif
	return fio;
}

xp_fio_t* xp_fio_opentmp (xp_fio_t* fio, xp_char_t* tmpl)
{
	if (fio == XP_NULL) 
	{
		fio = (xp_fio_t*)xp_malloc (xp_sizeof(xp_fio_t));
		if (fio == XP_NULL) return XP_NULL;
		fio->__dynamic = xp_true;
	}
	else fio->__dynamic = xp_false;

	fio->handle = xp_opentmp (tmpl);
	if (fio->handle == XP_HND_INVALID) 
	{
		if (fio->__dynamic) xp_free (fio);
		return XP_NULL;
	}

	return fio;
}

int xp_fio_close (xp_fio_t* fio)
{
	if (xp_close(fio->handle) == -1) return -1;
	if (fio->__dynamic) xp_free (fio);
	return 0;
}

int xp_fio_forfeit (xp_fio_t* fio)
{
	if (fio->__dynamic) xp_free (fio);
	return 0;
}

xp_fiohnd_t xp_fio_gethnd (xp_fio_t* fio)
{
	return fio->handle;
}

xp_off_t xp_fio_seek (xp_fio_t* fio, xp_off_t offset, int origin)
{
	return xp_seek (fio->handle, offset, origin);
}

xp_ssize_t xp_fio_read (xp_fio_t* fio, void* buf, xp_size_t size)
{
	return xp_read (fio->handle, buf, size);
}

xp_ssize_t xp_fio_write (xp_fio_t* fio, const void* data, xp_size_t size)
{
	return xp_write (fio->handle, data, size);
}

